#pragma once

#include <memory>

#include "rtda/frame.h"
#include "instructions/base/instructions.h"

namespace jvm {
namespace instructions {

// Push null
class ACONST_NULL : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};
    
// Push double
class DCONST_0 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class DCONST_1 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};
    
// Push float
class FCONST_0 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class FCONST_1 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class FCONST_2 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

// Push int constant
class ICONST_M1 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class ICONST_0 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class ICONST_1 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class ICONST_2 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class ICONST_3 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class ICONST_4 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class ICONST_5 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

// Push long constant
class LCONST_0 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};

class LCONST_1 : public NoOperandsInstruction {
public:
    void execute(std::shared_ptr<rtda::Frame> p_frame) override;
};


} // namespace instructions
} // namespace jvm

